// 中奖率支持模块
package xrate

import "gorm.io/gorm"

// 配置信息
type Config struct {
	DB          *gorm.DB // 数据库连接
	BatchName   string   // 批次表名，通过该表ID进行抽奖
	StartName   string   // 星级所属表名
	ProjectName string   // 奖品所属表名
	UserName    string   // 用户中奖表名
}

// 默认配置
var _default Config = Config{
	StartName:   "rate_start",
	ProjectName: "rate_project",
	BatchName:   "rate_batch",
	UserName:    "rate_user",
}

// 注入配置项
func Regedit(c *Config) {
	if c != nil {
		if _default.DB == nil && c.DB != nil {
			_default.DB = c.DB
		}
		if c.StartName != "" {
			_default.StartName = c.StartName
		}
		if c.ProjectName != "" {
			_default.ProjectName = c.ProjectName
		}
		if c.BatchName != "" {
			_default.BatchName = c.BatchName
		}
		if c.UserName != "" {
			_default.UserName = c.UserName
		}
		_default.DB.
			Set("gorm:table_options", "ENGINE=MyISAM").
			AutoMigrate(&Batch{}, &Start{}, &Project{}, &User{})
	}
}

// 批次表结构
type Batch struct {
	ID          uint   `gorm:"id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" form:"id" json:"id"`                     // 批次ID
	Name        string `gorm:"column:name;type:VARCHAR(200);comment:批次名称" json:"name" form:"name"`                                // 名称
	UserId      uint   `gorm:"column:user_id;type:INT UNSIGNED;comment:发布人ID" json:"user_id" form:"user_id"`                      // 发布人ID
	Icon        uint   `gorm:"column:icon;type:INT UNSIGNED;comment:icon图ID" json:"icon" form:"icon"`                             // 批次图标ID【关联文件ID】
	Cover       uint   `gorm:"column:cover;type:INT UNSIGNED;comment:封面图ID" json:"cover" form:"cover"`                            // 封面图ID【关联文件ID】
	IsDefault   uint8  `gorm:"column:is_default;type:TINYINT UNSIGNED;comment:是否为默认批次" json:"is_default" form:"is_default"`       // 是否是默认批次
	StartTime   string `gorm:"column:start_time;type:DATETIME;comment:开始时间" json:"start_time" form:"start_time"`                  // 开始时间
	EndTime     string `gorm:"column:end_time;type:DATETIME;comment:结束时间" json:"end_time" form:"end_time"`                        // 结束时间
	Guarantee   uint   `gorm:"column:guarantee;type:INT UNSIGNED;comment:保底次数" json:"guarantee" form:"guarantee"`                 // 保底次数
	GuaranteeId uint   `gorm:"column:guarantee_id;type:INT UNSIGNED;comment:保底产品ID" json:"guarantee_id" form:"guarantee_id"`      // 保底产品ID
	Status      uint8  `gorm:"column:status;type:TINYINT UNSIGNED;comment:状态 0-草稿 1-已发布（禁止修改） 2-已归档" json:"status" form:"status"` // 状态 0-草稿 1-已发布【已发布禁止修改】 2-已归档
	CreatedAt   string `gorm:"column:created_at;type:datetime;comment:创建时间" json:"created_at" form:"created_at"`                  // 创建时间
	UpdatedAt   string `gorm:"column:updated_at;type:datetime;comment:修改时间" json:"updated_at" form:"updated_at"`                  // 修改时间
}

// 表名
func (c *Batch) TableName() string {
	return _default.BatchName
}

// 星级表结构
type Start struct {
	ID        uint    `gorm:"id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" form:"id" json:"id"`                 // 星级ID
	UserId    uint    `gorm:"column:user_id;type:INT UNSIGNED;comment:发布人" json:"user_id" form:"user_id"`                    // 发布人ID
	BatchId   uint    `gorm:"column:batch_id;type:INT UNSIGNED;index:batch_id;comment:批次ID" json:"batch_id" form:"batch_id"` // 批次ID
	Name      string  `gorm:"column:name;type:VARCHAR(200);comment:星级名称" json:"name" form:"name"`                            // 名称
	Rate      float64 `gorm:"column:rate;type:DECIMAL(10,6);comment:中奖率" json:"rate" form:"rate"`                            // 中奖率
	Guarantee uint    `gorm:"column:guarantee;type:INT UNSIGNED;comment:保底次数" json:"guarantee" form:"guarantee"`             // 保底次数
	CreatedAt string  `gorm:"column:created_at;type:datetime;comment:创建时间" json:"created_at" form:"created_at"`              // 创建时间
	UpdatedAt string  `gorm:"column:updated_at;type:datetime;comment:修改时间" json:"updated_at" form:"updated_at"`              // 修改时间
}

// 表名
func (c *Start) TableName() string {
	return _default.StartName
}

// 奖品表结构
type Project struct {
	ID        uint    `gorm:"id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" form:"id" json:"id"`                 // 奖品ID
	UserId    uint    `gorm:"column:user_id;type:INT UNSIGNED;comment:发布人" json:"user_id" form:"user_id"`                    // 发布人ID
	Name      string  `gorm:"column:name;type:VARCHAR(200);comment:奖品名称" json:"name" form:"name"`                            // 名称
	StartID   uint    `gorm:"column:start_id;type:INT UNSIGNED;index:start_id;comment:星级ID" json:"start_id" form:"start_id"` // 星级ID
	BatchId   uint    `gorm:"column:batch_id;type:INT UNSIGNED;index:batch_id;comment:批次ID" json:"batch_id" form:"batch_id"` // 批次ID
	Rate      float64 `gorm:"column:rate;type:DECIMAL(10,6);comment:中奖率" json:"rate" form:"rate"`                            // 中奖率，公式为：星级中奖率 / 星级奖品数 * 奖品中奖率，100为标准中奖率，50为减半中奖率，200为双倍UP
	Inventory uint    `gorm:"column:inventory;type:INT UNSIGNED;comment:奖品总库存" json:"inventory" form:"inventory"`            // 奖品库存
	Residue   int     `gorm:"column:residue;type:INT;comment:剩余库存" json:"residue" form:"residue"`                            // 剩余库存
	CreatedAt string  `gorm:"column:created_at;type:datetime;comment:创建时间" json:"created_at" form:"created_at"`              // 创建时间
	UpdatedAt string  `gorm:"column:updated_at;type:datetime;comment:修改时间" json:"updated_at" form:"updated_at"`              // 修改时间
}

// 表名
func (c *Project) TableName() string {
	return _default.ProjectName
}

// 用户中奖记录表
type User struct {
	ID        uint   `gorm:"id;primaryKey;type:BIGINT UNSIGNED;not null;autoIncrement" form:"id" json:"id"`                         // 中奖ID
	UserId    uint   `gorm:"column:user_id;type:INT UNSIGNED;not null;index:user_id;comment:用户ID" json:"user_id" form:"user_id"`    // 中奖人id
	StartID   uint   `gorm:"column:start_id;type:INT UNSIGNED;index:start_id;comment:星级ID" json:"start_id" form:"start_id"`         // 星级ID
	ProjectID uint   `gorm:"column:project_id;type:INT UNSIGNED;index:project_id;comment:奖品ID" json:"project_id" form:"project_id"` // 奖品ID
	BatchId   uint   `gorm:"column:batch_id;type:INT UNSIGNED;index:batch_id;comment:批次ID" json:"batch_id" form:"batch_id"`         // 批次ID
	IsUsed    uint8  `gorm:"column:is_used;type:TINYINT UNSIGNED;comment:是否使用 0-未使用 1-已使用" json:"is_used" form:"is_used"`           // 是否使用 0-未使用 1-已使用
	Msg       string `gorm:"column:msg;type:VARCHAR(200);comment:抽奖备注" json:"msg" form:"msg"`                                       // 抽奖备注
	CreatedAt string `gorm:"column:created_at;type:datetime;comment:创建时间" json:"created_at" form:"created_at"`                      // 创建时间
	UpdatedAt string `gorm:"column:updated_at;type:datetime;comment:修改时间" json:"updated_at" form:"updated_at"`                      // 修改时间
}

// 表名
func (c *User) TableName() string {
	return _default.UserName
}

// 用户抽奖返回列表
type UserProject struct {
	ID          uint   `gorm:"id" form:"id" json:"id"`                                      // 中奖ID
	ProjectName string `gorm:"column:project_name" json:"project_name" form:"project_name"` // 奖品名称
	ProjectId   uint   `gorm:"column:project_id" json:"project_id" form:"project_id"`       // 奖品ID
	StartName   string `gorm:"column:start_name" json:"start_name" form:"start_name"`       // 星级名称
	StartId     uint   `gorm:"column:start_id" json:"start_id" form:"start_id"`             // 星级ID
	BatchName   string `gorm:"column:batch_name" json:"batch_name" form:"batch_name"`       // 批次名称
	BatchId     uint   `gorm:"column:batch_id" json:"batch_id" form:"batch_id"`             // 批次ID
	IsUsed      uint8  `gorm:"column:is_used" json:"is_used" form:"is_used"`                // 是否使用 0-未使用 1-已使用
	Msg         string `gorm:"column:msg" json:"msg" form:"msg"`                            // 抽奖备注
	CreatedAt   string `gorm:"column:created_at" json:"created_at" form:"created_at"`       // 创建时间
}
